#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""日志管理模块
提供统一的日志记录功能"""

import os
import logging
from datetime import datetime
import traceback

class Logger:
    """日志管理类
    提供统一的日志记录功能"""
    
    # 日志级别
    LEVELS = {
        'DEBUG': logging.DEBUG,
        'INFO': logging.INFO,
        'WARNING': logging.WARNING,
        'ERROR': logging.ERROR,
        'CRITICAL': logging.CRITICAL
    }
    
    # 默认日志配置
    _logger = None
    _log_dir = None
    
    @classmethod
    def init_logger(cls, log_dir=None, log_level='INFO'):
        """初始化日志系统
        
        Args:
            log_dir: 日志文件目录
            log_level: 日志级别
        """
        if cls._logger is not None:
            return cls._logger
        
        # 设置日志目录
        if log_dir is None:
            # 默认使用项目根目录下的logs文件夹
            current_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
            cls._log_dir = os.path.join(current_dir, 'logs')
        else:
            cls._log_dir = log_dir
        
        # 确保日志目录存在
        if not os.path.exists(cls._log_dir):
            os.makedirs(cls._log_dir)
        
        # 创建logger
        cls._logger = logging.getLogger('ProfessionalStockAnalysis')
        cls._logger.setLevel(cls.LEVELS.get(log_level.upper(), logging.INFO))
        
        # 清除已存在的处理器
        if cls._logger.handlers:
            for handler in cls._logger.handlers:
                cls._logger.removeHandler(handler)
        
        # 创建控制台处理器
        console_handler = logging.StreamHandler()
        console_handler.setLevel(logging.INFO)
        
        # 创建文件处理器
        log_file = os.path.join(cls._log_dir, f"app_log_{datetime.now().strftime('%Y%m%d_%H%M%S')}.log")
        file_handler = logging.FileHandler(log_file, encoding='utf-8')
        file_handler.setLevel(logging.DEBUG)
        
        # 设置日志格式
        formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
        console_handler.setFormatter(formatter)
        file_handler.setFormatter(formatter)
        
        # 添加处理器到logger
        cls._logger.addHandler(console_handler)
        cls._logger.addHandler(file_handler)
        
        return cls._logger
    
    @classmethod
    def _get_logger(cls):
        """获取logger实例，如果未初始化则自动初始化"""
        if cls._logger is None:
            return cls.init_logger()
        return cls._logger
    
    @classmethod
    def log_debug(cls, message):
        """记录调试信息
        
        Args:
            message: 日志信息
        """
        cls._get_logger().debug(message)
    
    @classmethod
    def log_info(cls, message):
        """记录一般信息
        
        Args:
            message: 日志信息
        """
        cls._get_logger().info(message)
    
    @classmethod
    def log_warning(cls, message):
        """记录警告信息
        
        Args:
            message: 警告信息
        """
        cls._get_logger().warning(message)
    
    @classmethod
    def log_error(cls, message):
        """记录错误信息
        
        Args:
            message: 错误信息
        """
        cls._get_logger().error(message)
        # 记录堆栈信息
        cls._get_logger().debug(traceback.format_exc())
    
    @classmethod
    def log_critical(cls, message):
        """记录严重错误信息
        
        Args:
            message: 严重错误信息
        """
        cls._get_logger().critical(message)
        # 记录堆栈信息
        cls._get_logger().debug(traceback.format_exc())